﻿#include<iostream>
using namespace std;

//public继承是⼀种is - a的关系。也就是说每个派⽣类对象都是⼀个基类对象。
// 
//组合是⼀种has - a的关系。假设B组合了A，每个B对象中都有⼀个A对象。
// 
//继承允许你根据基类的实现来定义派⽣类的实现。这种通过⽣成派⽣类的复⽤通常被称为⽩箱复⽤
//(white - box reuse)。术语“⽩箱”是相对可视性⽽⾔：在继承⽅式中，基类的内部细节对派⽣类可
//⻅ 。继承⼀定程度破坏了基类的封装，基类的改变，对派⽣类有很⼤的影响。派⽣类和基类间的依
//赖关系很强，耦合度⾼。
// 
//对象组合是类继承之外的另⼀种复⽤选择。新的更复杂的功能可以通过组装或组合对象来获得。对
//象组合要求被组合的对象具有良好定义的接⼝。这种复⽤⻛格被称为⿊箱复⽤(black - box reuse)，
//因为对象的内部细节是不可⻅的。对象只以“⿊箱”的形式出现。 组合类之间没有很强的依赖关
//系，耦合度低。优先使⽤对象组合有助于你保持每个类被封装。
// 
//优先使⽤组合，⽽不是继承。实际尽量多去⽤组合，组合的耦合度低，代码维护性好。不过也不太
//那么绝对，类之间的关系就适合继承(is - a)那就⽤继承，另外要实现多态，也必须要继承。类之间的
//关系既适合⽤继承(is - a)也适合组合(has - a)，就⽤组合




// Tire(轮胎)和Car(⻋)更符合has-a的关系
class Tire {
protected:
	string _brand = "Michelin"; // 品牌
	size_t _size = 17; // 尺⼨
};

class Car {
protected:
	string _colour = "白色"; // 颜⾊
	string _num = "000000"; // ⻋牌号
	Tire _t1; // 轮胎
	Tire _t2; // 轮胎
	Tire _t3; // 轮胎
	Tire _t4; // 轮胎
};

// Car和BMW/Benz更符合is-a的关系
class BMW : public Car {
public:
	void Drive() { cout << "好开-操控" << endl; }
};

class Benz : public Car {
public:
	void Drive() { cout << "好坐-舒适" << endl; }
};


// stack和vector的关系，既符合is-a，也符合has-a
template<class T>
class vector
{
};

//template<class T>
//class stack : public vector<T>
//{
//};

template<class T>
class stack
{
public:
	vector<T> _v;
};

//int main()
//{
//	return 0;
//}
